#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<string.h>

void printSigset(sigset_t *sigset)
{
	int sig;
	int cnt = 0;
	/* NSIG = 65 */
	for (sig = 1; sig < NSIG; sig++)
	{
		if (sigismember(sigset, sig))
		{
			cnt++;
			printf("%s\n",strsignal(sig));
		}
	}
	if (cnt == 0)
		printf("<empty signal set>\n");
}

/* 进程信号阻塞掩码 */
int print_process_sigmask()
{
	sigset_t mask;
	if (sigprocmask(SIG_BLOCK, NULL, &mask) == -1)
		return -1;
	printSigset(&mask);
	return 0;
}

void sig_cont(int signo)
{
	if (signo == SIGCONT) printf("catch SIGCONT\n");
	printf("process signal mask:\n");
	print_process_sigmask();
/* 
 * Child exited SIGCHLD
 * Continued    SIGCONT  通过sigaction设置信号signo的处理函数，当处理函数调用的时候，也会自动增加signo到进程的信号阻塞掩码中
 * */

}

void test1()
{
	sigset_t set;
	sigemptyset(&set);
	sigaddset(&set, SIGCHLD);

	struct sigaction act;
	/* 信号处理函数调用的时候,自动增加到进程的信号阻塞掩码中，退出处理函数后还原原来的阻塞掩码 */
	act.sa_mask = set; 
	act.sa_handler = sig_cont;

	sigaction(SIGCONT, &act, NULL); 
	//signal(SIGCONT, sig_cont); 使用signal设置，当处理函数调用的时候，也会自动增加该信号到进程的信号阻塞掩码中

	raise(SIGCONT);
	printf("process signal mask:\n");
	print_process_sigmask();
}


int main()
{
	test1();
	return 0;
}
